package com.blabla.knowledge;

/**
 * @author yzw
 * @date 2022/3/12 21:34
 * @desc volatile关键字示例代码
 * Java多线程并发处理数据问题
 * 模型示例
 * 线程1 -》工作内存1 ——》主内存
 * 线程2 -》工作内存2 ——》主内存
 * 线程3 -》工作内存3 ——》主内存
 * 针对体同时访问的主内存里的变量怎么保证原子性
 * 当一个变量被定义为volatile之后，其值得更改对其他线程是可见的
 */
public class VolatileDemo {

    public static final int THREAD_NUM = 20;

    public static void main(String[] args) {
        Thread[] threads = new Thread[THREAD_NUM];
        for (int i = 0; i < THREAD_NUM; i++) {
            threads[i] = new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i1 = 0; i1 < 10000; i1++) {

                    VolatileTest.raceIncrease();
                    }
                }
            });
            threads[i].start();
        }
        while (Thread.activeCount()>2){
            Thread.yield();
        }
        System.out.println(VolatileTest.race);
    }
}
